/** 
* Projet AP5 - Agenda PDA
* SpecificCalendar.java
*/


package pda.view;

import pda.control.*;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.GridLayout;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Insets;
import java.awt.Color;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* Classe qui creer l'interface du calendrier
*/

public class SpecificCalendar{


//##########################################################################################################
//										Attributs 
//##########################################################################################################
	/** Tableau d'etiquette pour les numeros des jours */
	private JLabel[] jours;
	/** Tableau d'image pour les jours */
	private ImagePanel[] joursFond;
	
	/** Tableau d'étiquettes des semaines*/
	private JLabel[] sems;

	/** Objet de la classe AgendaControl */
	private AgendaControl controller;

	/** Objet de la classe AgendaView */
	private AgendaView vue;

	/** Objet de la classe ClickDay */
	private ClickDay dayEvent;

	/** Chaine de caractère pour le jour actuel */
	private String aujourdhui;
	
//##########################################################################################################
//										Constructeur 
//##########################################################################################################
	/** 
	* Constructeur de la classe 
	* @param vue 
	* @param controller 
	*/
	public SpecificCalendar(AgendaView vue, AgendaControl controller){
		this.controller = controller;
		this.vue = vue ;
		this.dayEvent = new ClickDay(this, controller) ;
		String date = (Integer.parseInt(new SimpleDateFormat("dd").format(new Date())) < 10)? new SimpleDateFormat("EEEEEEEE d/MM/yyyy").format(new Date()): new SimpleDateFormat("EEEEEEEE dd/MM/yyyy").format(new Date());
		aujourdhui =  ((String.valueOf(date.charAt(0))).toUpperCase())+ date.substring(1);
	}
	
	
	
//##########################################################################################################
//										Methodes 
//##########################################################################################################

	//=======================================================================================initCalendrierCentre
	/**
	* Creer les boutons et les tableaux des semaines et des jours
	* @param date 
	*/
	public void initCalendrierCentre (String date) {
		
		vue.getCalendar().setLayout (new GridLayout (7, 8));
		vue.getCalendar().setBackground (Color.black);

		JLabel[] joursSemaineLabel = new JLabel[8];
		
		//premiere ligne avec les jours
		for (int i = 0; i<8; i++) {
			joursSemaineLabel[i] = new JLabel("", JLabel.CENTER);
			joursSemaineLabel[i].setForeground (Color.white);
			vue.getCalendar().add (joursSemaineLabel[i]);
			
		}
		
		joursSemaineLabel[0].setText ("Sem");
		joursSemaineLabel[1].setText ("L");
		joursSemaineLabel[2].setText ("M");
		joursSemaineLabel[3].setText ("M");
		joursSemaineLabel[4].setText ("J");
		joursSemaineLabel[5].setText ("V");
		joursSemaineLabel[6].setText ("S");
		joursSemaineLabel[7].setText ("D");

		
		//ajout des lignes suivantes
		int j=0;
		jours = new JLabel[42];
		joursFond = new ImagePanel[42];
		sems = new JLabel[7];

		//tant que l'on a pas fini de parcourir le calendrier, on ajoute les boutons
		for (int i = 0; i<42; i++) {
			
			if ( (i%7)==0 && j<7) {
				sems[j] = new JLabel ();
				vue.getCalendar().add (sems[j]);
				j++;
			}
			joursFond[i]= new ImagePanel("data/img/agenda/day.png");
			joursFond[i].setLayout(new BorderLayout());
			
			jours[i] = new JLabel();
			Insets noMargin = new Insets (0, 0, 0, 0);

			joursFond[i].add(jours[i]);
			vue.getCalendar().add (joursFond[i]);
			
			
		}
		initCalendrierValue(date);
	}


	//=======================================================================================initWeekCentre
	/**
	* Creer le calendrier
	*/
	public void initWeekCentre(){
		vue.getCalendar().setLayout (new GridLayout (7, 8));
		vue.getCalendar().setBackground (Color.black);

		JLabel[] joursSemaineLabel = new JLabel[8];
		JPanel[] joursSemainePanel = new JPanel[8];
		
		//premiere ligne avec les jours
		for (int i = 0; i<8; i++) {
			joursSemainePanel[i] = new JPanel();
			joursSemainePanel[i].setBackground(Color.black);
			
			joursSemaineLabel[i] = new JLabel("", JLabel.CENTER);
			joursSemaineLabel[i].setForeground (Color.white);
			
			joursSemainePanel[i].add (joursSemaineLabel[i]);
			vue.getCalendar().add (joursSemainePanel[i], JPanel.CENTER_ALIGNMENT);	
		}
		
		joursSemaineLabel[1].setText ("L");
		joursSemaineLabel[2].setText ("M");
		joursSemaineLabel[3].setText ("M");
		joursSemaineLabel[4].setText ("J");
		joursSemaineLabel[5].setText ("V");
		joursSemaineLabel[6].setText ("S");
		joursSemaineLabel[7].setText ("D");

		
		//ajout des lignes suivantes
		int j=0;
		JLabel[] jours = new JLabel[42];
		JLabel[] sems = new JLabel[6];

		//tant que l'on a pas fini de parcourir le calendrier, on ajoute les boutons
		for (int i = 0; i<42; i++) {
			if ( (i%7)==0 && j<6) {
				sems[j] = new JLabel ();
				vue.getCalendar().add (sems[j]);
				j++;
			}
			
			jours[i] = new JLabel ();
			Insets noMargin = new Insets (0, 0, 0, 0);

			vue.getCalendar().add (jours[i]);
			
		}
	}


	//=======================================================================================initCalendrierValue
	/**
	* Permet d'avoir le decalage des jours par rapport au mois 
	*/
	public void initCalendrierValue(String dateChoosenLbl){
		int year = Integer.parseInt(dateChoosenLbl.split("/")[2]);
		int month = Integer.parseInt(dateChoosenLbl.split("/")[1]);
		String today = dateChoosenLbl.split("/")[0];
		int day = 1;
		GregorianCalendar calendar = new GregorianCalendar(year,month-1,day);
		int firstDayMonth = calendar.get(Calendar.DAY_OF_WEEK);

		int numberOfWeek = calendar.get(Calendar.WEEK_OF_YEAR);

		int numberOfDayInMonth = (month == 1 || month == 3 || month == 5 || month ==7 || month == 8 || month == 10 || month == 12)?31:(month == 2 && calendar.isLeapYear(year))?29 : (month == 2 && !calendar.isLeapYear(year))?28:30;
	
	
	//mise en place numero des semaines
		int j = 0;
		
		for (int i=0 ; i <numberOfDayInMonth ; i++){
			if (i%7 == 0 && j<7){
				if (numberOfWeek+j > 52 && month == 1){
					numberOfWeek = 0;
				}else if (numberOfWeek+j >52 && month == 12){
					numberOfWeek = 1-j;
				}
				sems[j].setText(String.valueOf(numberOfWeek+j));
				sems[j].setForeground(Color.white);
				sems[j].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
				j++;
			}
		} 
		if (j==4 ){
			sems[j].setText(String.valueOf(numberOfWeek+j));
			sems[j].setForeground(Color.white);
			sems[j].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		}else if (j == 5){
			sems[5].setText(String.valueOf(numberOfWeek+j));
			sems[5].setForeground(Color.white);
			sems[5].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		}
		
		
	//mise en place des jours du mois et des ecouteurs
		int tmp = -1;
		for (int i = 0 ; i < numberOfDayInMonth;i++){
			
			switch ( firstDayMonth ) {
				case 1:
					tmp = 6;
				break;
				case 2:
					tmp = 0;
				break;
				case 3:
					tmp = 1;
				break;
				case 4:
					tmp = 2;
				break;
				case 5:
					tmp = 3;
				break;
				case 6:
					tmp = 4;
				break;
				case 7:
					tmp = 5;
				break;
				default:
				System.out.println("Erreur de jours ");
				break;	
			}
			

			jours[i+tmp].setOpaque(false);
			joursFond[i+tmp].setBackground(Color.black);
			jours[i+tmp].setBackground(Color.white);
			jours[i+tmp].setForeground(Color.black);
			jours[i+tmp].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
			jours[i+tmp].setText(String.valueOf(i+1));
		
			//le jour selectionner
			if (i+1 == Integer.parseInt(dateChoosenLbl.split("/")[0].split(" ")[1]) && month == Integer.parseInt(dateChoosenLbl.split("/")[1]) && year == Integer.parseInt(dateChoosenLbl.split("/")[2])){
			
				joursFond[i+tmp].setBackground(Color.black);
				if (controller.getEvtExiste(String.valueOf(i+1)+"/"+month+"/"+year)){
					joursFond[i+tmp].setImage("data/img/agenda/daySelectWtAct.png");
				}else {
					joursFond[i+tmp].setImage("data/img/agenda/daySelect.png");
				}
			}			
			
			//tout les jours non selectionner
			
			if (controller.getEvtExiste(String.valueOf(i+1)+"/"+month+"/"+year) && !(i+1 == Integer.parseInt(dateChoosenLbl.split("/")[0].split(" ")[1]) && month == Integer.parseInt(dateChoosenLbl.split("/")[1]) && year == Integer.parseInt(dateChoosenLbl.split("/")[2]))){
				jours[i+tmp].setBackground(Color.red);
				joursFond[i+tmp].setImage("data/img/agenda/dayWtAct.png");
			}
			jours[i+tmp].addMouseListener(dayEvent);
			//le jour d'aujoud'hui
			if (i+1 == Integer.parseInt(aujourdhui.split("/")[0].split(" ")[1]) && month == Integer.parseInt(aujourdhui.split("/")[1]) && year == Integer.parseInt(aujourdhui.split("/")[2])){
				jours[i+tmp].setText("<html><u>"+String.valueOf(i+1)+"</u><html");
				jours[i+tmp].setForeground(Color.white);	
				// joursFond[i+tmp].setImage("data/img/agenda/today.png");
			}
		}
		
		
		
		// mise en place des jours du mois suivant
		for (int i = numberOfDayInMonth+tmp ; i <42 ; i++){
			jours[i].setText(String.valueOf(i-numberOfDayInMonth-tmp+1));
			joursFond[i].setBackground(Color.black);
			jours[i].setForeground(Color.LIGHT_GRAY);
			joursFond[i].setImage("data/img/agenda/noDay.png");
		}
		//desactivation des jours d moi precedant
		for (int k = 0 ; k < tmp ; k++){
			jours[k].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		}
		//mise en place des jours du mois precedant
		int prevMonth = (Integer.parseInt(dateChoosenLbl.split("/")[1]) == 1)? 12: Integer.parseInt(dateChoosenLbl.split("/")[1])-1;
		int prevYear = (Integer.parseInt(dateChoosenLbl.split("/")[1]) == 1)? year-1: year;
		GregorianCalendar prevCal  = new GregorianCalendar(prevYear,prevMonth,1); 
		int prevMonthNumber = (prevMonth == 1 || prevMonth == 3 || prevMonth == 5 || prevMonth ==7 || prevMonth == 8 || prevMonth == 10 || prevMonth == 12)?31:(prevMonth == 2 && prevCal.isLeapYear(year))?29 : (prevMonth == 2 && !prevCal.isLeapYear(year))?28:30;
		int  l = 0;
		for (int i = tmp-1 ; i > -1 ; i--){
			jours[i].setText(String.valueOf(prevMonthNumber-l));
			joursFond[i].setBackground(Color.black);
			jours[i].setForeground(Color.LIGHT_GRAY);
			joursFond[i].setImage("data/img/agenda/noDay.png");
			l++;
		}
		//desactivation de jours du mois suivant
		for (int k = numberOfDayInMonth+tmp ; k < 42 ; k++){
			jours[k].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);			
		}	
	}
	

//##########################################################################################################
//										Methodes Get
//##########################################################################################################

	/**
	* Retourne la date actuel
	* @return aujourdhui */
	public String getToday(){ return aujourdhui ; }
	/**
	* Retourne la vue
	* @return vue */
	public AgendaView getVue() { return vue; }



}